/**
 * 
 */
package com.iss.card.view.overrideview;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;

import com.iss.card.R;
import com.iss.card.view.model.CityBean;

/**
 * @author dtdh
 * 
 */
public class ListWithSectionAdapter extends BaseAdapter {
	private final static String TAG = ListWithSectionAdapter.class
			.getSimpleName();
	public final Map<String, Adapter> mSectionDatas = new LinkedHashMap<String, Adapter>();
	public final ArrayAdapter<String> mSectionHeaders;
	public final static int TYPE_SECTION_HEADER = 0;
	private Context mContext;

	public ListWithSectionAdapter(Context context) {
		mContext = context;
		mSectionHeaders = new ArrayAdapter<String>(context,
				R.layout.listview_section_header);
	}

	public void addSection(String section, Adapter adapter) {
		this.mSectionHeaders.add(section);
		this.mSectionDatas.put(section, adapter);
	}

	public void setContentDatas(Map<String, List<CityBean>> datas,
			Adapter adapter) {
		Iterator<String> keyIt = datas.keySet().iterator();
		while (keyIt.hasNext()) {
			String key = keyIt.next();
			addSection(key, adapter);
		}
	}

	public Object getItem(int position) {
		for (Object section : this.mSectionDatas.keySet()) {
			Adapter adapter = mSectionDatas.get(section);
			int size = adapter.getCount() + 1;

			// check if position inside this section
			if (position == 0) {
				return section;
			}
			if (position < size) {
				return adapter.getItem(position - 1);
			}

			// otherwise jump into next section
			position -= size;
		}
		return null;
	}

	public int getCount() {
		// total together all sections, plus one for each section header
		int total = 0;
		for (Adapter adapter : this.mSectionDatas.values()) {
			total += adapter.getCount() + 1;
		}
		return total;
	}

	public int getViewTypeCount() {
		// assume that headers count as one, then total all sections
		int total = 1;
		for (Adapter adapter : this.mSectionDatas.values()) {
			total += adapter.getViewTypeCount();
		}
		return total;
	}

	public int getItemViewType(int position) {
		int type = 1;
		for (Object section : this.mSectionDatas.keySet()) {
			Adapter adapter = mSectionDatas.get(section);
			int size = adapter.getCount() + 1;

			// check if position inside this section
			if (position == 0) {
				return TYPE_SECTION_HEADER;
			}
			if (position < size) {
				return type + adapter.getItemViewType(position - 1);
			}

			// otherwise jump into next section
			position -= size;
			type += adapter.getViewTypeCount();
		}
		return -1;
	}

	public boolean areAllItemsSelectable() {
		return false;
	}

	public boolean isEnabled(int position) {
		return (getItemViewType(position) != TYPE_SECTION_HEADER);
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		int sectionnum = 0;
		for (Object section : this.mSectionDatas.keySet()) {
			Adapter adapter = mSectionDatas.get(section);
			int size = adapter.getCount() + 1;

			// check if position inside this section
			if (position == 0) {
				return mSectionHeaders.getView(sectionnum, convertView, parent);
			}
			if (position < size) {
				return adapter.getView(position - 1, convertView, parent);
			}

			// otherwise jump into next section
			position -= size;
			sectionnum++;
		}
		return null;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}
}
